Ze String na Char
Otázka od: Martin Novák
10. 9. 2002 12:10
Zdravim,
chtel bych vedet, jak prevedu jedno pismenko z retezce String na
Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
String. Poradte. Jak prevest String o jednom pismenku na Char.
(Delphi 5, Win98SE).
Dekuji.
S pozdravem Martin.
--------------------
ZDARMA a RYCHLÉ zasílání SMS z www.posliSMS.cz
Odpovedá: Zbysek Hlinka
10. 9. 2002 10:29
On 10 Sep 2002 at 7:38, Martin Novák wrote:
> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
> Char. Funkce Copy mi jedno pismenko vybere, ale je to porad String.
> Poradte. Jak prevest String o jednom pismenku na Char.
var
s: string;
c: char;
s := 'a';
c := s[1];
S pozdravem
Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282
Odpovedá: Jiri Wendl, KSH-Data
10. 9. 2002 8:28
Ahoj
Zkus tohle:
var
s: string;
z: char;
begin
s := 'abc';
z := s[1]; // z obsahuje 'a'
z := s[2]; // z obsahuje 'b'
z := s[3]; // z obsahuje 'c'
Jirka
>Zdravim,
> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
>Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
>String. Poradte. Jak prevest String o jednom pismenku na Char.
>(Delphi 5, Win98SE).
> Dekuji.
> S pozdravem Martin.
--------------------
ZDARMA a RYCHLÉ zasílání SMS z www.posliSMS.cz
Odpovedá: Zdenek Brejsa
10. 9. 2002 22:08
> Zdravim,
> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
> Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
> String. Poradte. Jak prevest String o jednom pismenku na Char.
Ja pouzivam kontrukci
S: String
C: Char
C := (S + #0)[1]
protoze pokud by S = '', pak by doslo k vyjimce
Zdenek Brejsa - programator HJ-SOFT s.r.o.
Hradebni 3
56301 Lanskroun
Tel: 511096, 522889, 524795
Mob: 0602592948, 0603833124
ICQ: 47636291
Odpovedá: Petr Vones
10. 9. 2002 15:31
From: "Zdenek Brejsa" <prog@hjsoft.cz>
> Ja pouzivam kontrukci
> S: String
> C: Char
>
> C := (S + #0)[1]
Velmi efektivni zpusob Proc misto jednoducheho porovnani delky retezce
radeji nealokovat retezec novy, zkopirovat cely obsah predchoziho, pridat
dalsi znak a to vse jen proto, aby jsme jinak prectli jeden byte z toho
stringu.
Petr Vones
Odpovedá: Vymazal Milan
10. 9. 2002 18:51
Hello Martin,
Tuesday, September 10, 2002, 7:38:14 AM, you wrote:
MN> Zdravim,
MN> chtel bych vedet, jak prevedu jedno pismenko z retezce String na
MN> Char. Funkce Copy mi jedno pismenko vybere, ale je to porad
MN> String. Poradte. Jak prevest String o jednom pismenku na Char.
MN> (Delphi 5, Win98SE).
MN> Dekuji.
MN> S pozdravem Martin.
MN> --------------------
MN> ZDARMA a RYCHLÉ zasílání SMS z www.posliSMS.cz
var
s:string;
c:char;
begin
c:=Pchar(s[1]);
napr
--
Best regards,
Vymazal mailto:vymazal.milan@seznam.cz
Odpovedá: Michal
11. 9. 2002 0:33
var s : string;
c : Char;
begin
s := '';
if s <> '' then
c := s[1];
end;
Odpovedá: Dalibor Toman
10. 9. 2002 18:20
> > C := (S + #0)[1]
>
> Velmi efektivni zpusob Proc misto jednoducheho porovnani delky
retezce
> radeji nealokovat retezec novy, zkopirovat cely obsah predchoziho,
pridat
> dalsi znak a to vse jen proto, aby jsme jinak prectli jeden byte z
toho
> stringu.
>
Sice je to neefektivni, ale podle mne ne tolik jak popisujes. K nove
alokaci (a kopirovani obsahu puvodniho retezce) nedojde, protoze
stavajici jednoznakovy retezec se urcite da bez realokace bufferu
prodlouzit o jeden znak.
D. Toman
Odpovedá: Petr Vones
10. 9. 2002 23:35
From: "Dalibor Toman" <dtoman@fortech.cz>
> Sice je to neefektivni, ale podle mne ne tolik jak popisujes. K nove
> alokaci (a kopirovani obsahu puvodniho retezce) nedojde, protoze
> stavajici jednoznakovy retezec se urcite da bez realokace bufferu
> prodlouzit o jeden znak.
Prelozi se to s volanim _LStrCat3. V nasledujicim testu mi to vychazelo cca
50x pomalejsi:
uses
JclCounter;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
C: Char;
Cnt: TJclCounter;
I: Integer;
T1, T2: Extended;
begin
S := '12345';
StartCount(Cnt);
for I := 1 to 100000 do
C := (S + #0)[1];
T1 := StopCount(Cnt) * 1000;
Memo1.Lines.Add(C);
StartCount(Cnt);
for I := 1 to 100000 do
begin
if Length(S) > 0 then
C := S[1]
else
C := #0;
end;
T2 := StopCount(Cnt) * 1000;
Memo1.Lines.Add(C);
Memo1.Lines.Add(Format('%5.3f %5.3f', [T1, T2]));
end;
Petr Vones
Odpovedá: Dalibor Toman
10. 9. 2002 18:18
> From: "Dalibor Toman" <dtoman@fortech.cz>
> > Sice je to neefektivni, ale podle mne ne tolik jak popisujes. K
nove
> > alokaci (a kopirovani obsahu puvodniho retezce) nedojde, protoze
> > stavajici jednoznakovy retezec se urcite da bez realokace bufferu
> > prodlouzit o jeden znak.
>
> Prelozi se to s volanim _LStrCat3. V nasledujicim testu mi to
vychazelo cca
> 50x pomalejsi:
Koukal jsem pro jistotu do zdrojaku _LStrCat3 a pri scitani
jednoznakoveho stringa a Charu to nakonec opravdu skonci tak jak jsem
psal (memory manager pri resize nic noveho nenaalokuje) - ale toho
kodu co se mezi tim vykona - hruza.
Ja jsem se samozrejme nechtel zastavat toho zpusobu prevodu Charu na
Stringo - jen jsem do Tebe chtel rejpnout, ze pro jednou nemas tak
uplne pravdu
D. Toman
Odpovedá: Petr Vones
10. 9. 2002 17:16
From: "Dalibor Toman" <dtoman@fortech.cz>
> Ja jsem se samozrejme nechtel zastavat toho zpusobu prevodu Charu na
> Stringo - jen jsem do Tebe chtel rejpnout, ze pro jednou nemas tak
> uplne pravdu
No, asi ne jen pro jednou Ale v tomhle pripade jsem mel namysli hlavne to
volani _NewAnsiString a Move v _LStrAsg, ktery se v tomhle pripade vola z
_LStrCat3.
Petr Vones